/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package heartsgamejava;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JPanel;

/**
 *
 * @author 0812627
 */
public class HeartsGamePanel extends JPanel implements Runnable{
    private static final int PWIDTH = 1000;// kich thuot cua panel
    private static final int PHEIGHT = 700;// kich thuot cua panel
    static int iSTT[]  = new int[13];
    private Thread animator; //tuyen chay hoat canh
    private boolean running = false ;// biến điều kiện ngưng vòng lặp
    private boolean gameOver = false ;// biến điều kiển kết thúc game
    //
    //các giá trị toàn cục để vẽ ngoài màn hình
    private Graphics dbg;
    private Image dbImage = null;
    HeartsGameGraphics dbGraphic;

    //Các biến toàn cục của bài
    private boolean [] isDraw = new boolean[3];
    //Rectangle position = new Rectangle(300, 400, 200, 200);
    Image[] img;
    // mơi thêm 21/6
    HeartsLocationPanel heartsLocationPanel = new HeartsLocationPanel();
    int abc = -1;

    public HeartsGamePanel()
    {
        setBackground(Color.WHITE);
        setPreferredSize(new Dimension(PWIDTH,PHEIGHT));

        setFocusable(true);
        requestFocus();// JPanel bây giờ có thể nhận sự kiện phím
        readyForTermination();
        //tạo các thành phần game

        //Lắng nghe sự kiện nhấn chuột
        addMouseListener(new MouseAdapter()
        {
            @Override
            public void mousePressed(MouseEvent e)
            {
                HeartsPress(e.getX(), e.getY());
            }


        });
    }

    @Override
    public void addNotify()
    // Chờ JFrame được gắn vào trước khi bắt đầu
    {
        super.addNotify();
        startGame();
    }

    private void startGame()
    // khởi tạo và bắt đầu Thread
    {
        for(int i = 0; i < isDraw.length ;i++)
        {
            isDraw[i] = true;
        }



        if(animator == null || !running)
        {
            animator = new Thread(this);
            animator.start();
        }
    }

    public void stopGame()
    {
        running = false;
    }


    public void run()
    {
        running = true;
        while(running)
        {
            gameUpdate();// trạng thái game được cập nhật
            try {
                gameRender(); //repaint(); // vẽ bộ đệm lên màn hình
                //repaint(); // vẽ bộ đệm lên màn hình
            } catch (InterruptedException ex) {
                Logger.getLogger(HeartsGamePanel.class.getName()).log(Level.SEVERE, null, ex);
            }
            paintScreen();
            try {
                Thread.sleep(20); // ngủ một khoảng ngắn
            } catch (InterruptedException ex) {
                Logger.getLogger(HeartsGamePanel.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        }
        System.exit(0);// đóng JFrame
    }

    private void gameUpdate() {
        if(!gameOver) // cập nhật trạng thái game
        {
            if(HeartsStaticObject.iCardClient[0] !=-1)
            {
              HeartsStaticObject.heartDeckStatic.getPlayers(1).getCardsInHand().get(HeartsStaticObject.iCardClient[0]).setiStatusPlay(1);

            }
            if(HeartsStaticObject.iCardClient[1] !=-1)
            {
              HeartsStaticObject.heartDeckStatic.getPlayers(2).getCardsInHand().get(HeartsStaticObject.iCardClient[1]).setiStatusPlay(1);

            }
            if(HeartsStaticObject.iCardClient[2] !=-1)
            {
              HeartsStaticObject.heartDeckStatic.getPlayers(3).getCardsInHand().get(HeartsStaticObject.iCardClient[2]).setiStatusPlay(1);

            }
        }
    }

    private void gameRender() throws InterruptedException
    // vẽ một frame hiện hành vào một ảnh của bộ đệm
    {

        if(dbImage == null)
        {
            //tạo ảnh bộ đệm
            dbImage = createImage(PWIDTH,PHEIGHT);
            if(dbImage == null)
            {

            }
            else
                dbGraphic = new HeartsGameGraphics(dbImage);
  
        }

        // Vẽ các phần tử game
        
        dbGraphic.drawGraphics(this);

        
        if(gameOver)
            gameOverMessage(dbGraphic);
    }

    private void gameOverMessage(HeartsGameGraphics dbGraphic) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void paintComponent (Graphics g)
    {
        super.paintComponent(g);
        if(dbImage != null)
        {
            g.drawImage(dbImage, 0, 0, null);
        }
    }

    private void readyForTermination()
    {
        addKeyListener(new KeyAdapter() {
            //Lắng nghe các phím éc,q,end
            @Override
            public void keyPressed(KeyEvent e)
            {
                int keyCode = e.getKeyCode();
                if((keyCode == KeyEvent.VK_ESCAPE)&&e.isControlDown())
                {
                    running = false;
                }
            }
        });

    }


    int HeartsPlayOneCardBasic(int iLocation, int iPlayer)
    {
          // tìm số thứ tự các quân bài trong mảng dựa vào vị trí của chúng trên màn hình
                iSTT[iLocation] = HeartsStaticObject.heartDeckStatic.getPlayers(iPlayer).findLocation(iLocation);
          // gán trạng thái đã chơi của quân bài tìm được là 1
                HeartsStaticObject.heartDeckStatic.getPlayers(iPlayer).getCardsInHand().get(iSTT[iLocation]).setiStatusPlay(1);
           // gán các vị trí tiếp theo trong danh sách các quân bài
                //giảm đi một đơn vị kể từ quân bài đã chọn
                // đầu vào là vị trí quân bài đã chọn
                // xử lí: xét các vị trí tiếp theo

                // kết quả: các vị trí tiếp theo tăng lên một đơn vị
                HeartsStaticObject.heartDeckStatic.getPlayers(iPlayer).setLocations(iLocation);
              // gán vị trí của quân bài đó là -1
                // vì nó đã chơi nên không còn đứng trên màn hình nữa
                HeartsStaticObject.heartDeckStatic.getPlayers(iPlayer).getCardsInHand().get(iSTT[iLocation]).setiLocation(-1);

                return iSTT[iLocation];

    }
    // đầu vào là vị trí trên màn hình
    // trả về số thứ tự của lá bài và người chơi thứ mấy
    int  HeartsPlayOneCard(int iLocation, int iPlayer)
    {
          // tìm số thứ tự của lá bài
          iSTT[iLocation] = HeartsStaticObject.heartDeckStatic.getPlayers(iPlayer).findLocation(iLocation);

          // nếu số thứ tự bằng -1
          if(iSTT[iLocation]== -1)
          {
                return HeartsPlayOneCardBasic(iLocation - 1, iPlayer);

          }
          else
          {
                HeartsPlayOneCardBasic(iLocation,iPlayer);
                return iSTT[iLocation];
          }


    }

    private void HeartsPress(int x, int y)
    {
        if(!gameOver)
        {
            for(int i= 0 ; i <13; ++i)
            {
            // thực hiện chọn bài kiểm tra bài

                if(( heartsLocationPanel.iLocationPanel[i] < x )&&( x < heartsLocationPanel.iLocationPanel[i+1] )&&(500 < y) &&(y<635))
                {

                    HeartsStaticObject.iCardServer = HeartsPlayOneCard(i,0);
                }
                if(( heartsLocationPanel.iLocationPanel[i] < x )&&( x < heartsLocationPanel.iLocationPanel[i+1] )&&(300 < y) &&(y<400))
                {
                    HeartsStaticObject.iCardClient[1] = i;
                    //HeartsStaticObject.iCardServer = HeartsPlayOneCard(i,1);
                }
                if(( heartsLocationPanel.iLocationPanel[i] < x )&&( x < heartsLocationPanel.iLocationPanel[i+1] )&&(400 < y) &&(y<500))
                {
                    HeartsStaticObject.iCardClient[0] = i;

                }
                if(( heartsLocationPanel.iLocationPanel[i] < x )&&( x < heartsLocationPanel.iLocationPanel[i+1] )&&(0 < y) &&(y<300))
                {
                    HeartsStaticObject.iCardClient[2] = i;

                }
            }

            if(( 0 < x )&&( x <100 ))
            {
                HeartsStaticObject.heartDeckStatic.getPlayers(0).getCardsInHand().get(4).setiStatusPlay(2);
                isDraw[1] = false;

            }

        }
    }

    private void paintScreen()
            // vẽ bộ đệm ảnh lên màn hình
    {
        Graphics g;
        try
        {
            g = this.getGraphics();// lấy ngữ cảnh đồ họa của panel
            if((g!=null)&&(dbImage!=null))
            {
                g.drawImage(dbImage, 0, 0, this);
            }
        }
        catch(Exception e){
            System.out.println("error graphic draw"+ e);
        }
    }


}
